#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

struct punkt
{
   int nr;
   float x;
   float y;
};

struct koneksja
{
   punkt * w1;
   punkt * w2;
   punkt * w3;
   int obszar;
};

struct brzeg
{
   void Brzeg(int liczbaWezlow){elementy.resize(liczbaWezlow+1);}
   int obszar;
   vector<int> elementy;
};

class siatka
{
   public:
      void UstawWezly(int a){liczba_wezlow=a+1;pkty.resize(a+1);}
      void UstawElementy(int a){liczba_elementow=a+1;koneksje.resize(a+1);}
      void UstawBrzegi(int a){liczba_brzegow=a+1;brzegi.resize(a+1);}
//  protected:
      int liczba_wymiarow;
      int liczba_wezlow;
      int liczba_elementow;
      int liczba_brzegow;
      int liczba_obszarow;
      vector<punkt> pkty;
      vector<koneksja> koneksje;
      vector<brzeg> brzegi;
};

int str_int(string s)
{
   int i;
   istringstream myStream(s);
   myStream>>i;
   return i;
}

float str_flt(string s)
{
   float i;
   istringstream myStream(s);
   myStream>>i;
   return i;
}

bool Mycmp(string p,string d,int l)
{
   int i=0;
   if (p[0] == 0 ) return false;
   while(i<l){
      if(p[i]!=d[i])
      {
         return false;
      }
      ++i;
   }
   return true;
}

void Wczytaj_MSH(vector<string>& tablica, char* plik)
{
   char * msh = ".msh";
   int ii=0;
   while(plik[ii]!= '\0'){ ii++;}
   fstream wejscie;wejscie.open(strcat(plik, msh));
   plik[ii] = '\0';
   int i=0;
   while(!wejscie.eof())
   {
      tablica.resize(tablica.size()+1);
      getline(wejscie,tablica[i]);
      i++;
   }
   wejscie.close();
}

void WczytajWezly(siatka & s,string linia)
{
   istringstream wejscie(linia);
   int tmp; float x,y;
   wejscie >> tmp;
   wejscie >> x; wejscie >> y;
   s.pkty[tmp].nr=tmp;
   s.pkty[tmp].x=x;
   s.pkty[tmp].y=y;
}


void WczytajKoneksje(siatka & s,string linia)
{
   istringstream wejscie(linia);
   string cos; int tmp,w1,w2,w3;
   wejscie >> tmp; wejscie >> cos;
   wejscie >> w1; wejscie >> w2; wejscie >> w3;
   s.koneksje[tmp].w1=&s.pkty[w1];
   s.koneksje[tmp].w2=&s.pkty[w2];
   s.koneksje[tmp].w3=&s.pkty[w3];
}


void WczytajBrzegi(siatka & s,string liniap,string liniad)
{
   istringstream wejscie(liniap);
   istringstream lbrzeg(liniad);
   int nr,liczbaWezlow,obsz;
   wejscie >> nr; wejscie >> liczbaWezlow; wejscie >> obsz;
   s.brzegi[nr].Brzeg(liczbaWezlow);s.brzegi[nr].obszar=obsz;
   for(int i=1;i<=liczbaWezlow;i++) lbrzeg>>s.brzegi[nr].elementy[i];
}


void Wyciagnij_MSH(siatka & s, vector<string>& tablica)
{
   if(Mycmp(tablica[0],"<SIATKA>",8) || Mycmp(tablica[0],"<siatka>",8) ){
   for(unsigned int i=1;i<tablica.size();i++)
   {
      if(tablica[i][0]==0)continue;
      if(Mycmp(tablica[i],"[OPIS]",6) || Mycmp(tablica[i],"<opis>",6));
      if(Mycmp(tablica[i],"[LICZBA WYMIAROW]",17) || Mycmp(tablica[i],"[liczba wymiarow]",17)){s.liczba_wymiarow=str_int(tablica[++i]);}
      if(Mycmp(tablica[i],"[LICZBA WEZLOW]",15) || Mycmp(tablica[i],"[liczba wezlow]",15)){s.UstawWezly(str_int(tablica[++i]));}
      if(Mycmp(tablica[i],"[LICZBA ELEMENTOW]",18) || Mycmp(tablica[i],"[liczba elementow]",18)){s.UstawElementy(str_int(tablica[++i]));}
      if(Mycmp(tablica[i],"[LICZBA BRZEGOW]",16) || Mycmp(tablica[i],"[liczba brzegow]",16)){s.UstawBrzegi(str_int(tablica[++i]));}
      if(Mycmp(tablica[i],"[LICZBA OBSZAROW]",17) || Mycmp(tablica[i],"[liczba obszarow]",17)){s.liczba_obszarow=str_int(tablica[++i]);}
      if(Mycmp(tablica[i],"[WSPOLRZEDNE WEZLOW]",20) || Mycmp(tablica[i],"[wspolrzedne wezlow]",20)){
      ++i;
      while(!(tablica[i][0]==0))
      {
         WczytajWezly(s,tablica[i]);
         i++;
      }
   }
   if(Mycmp(tablica[i],"[KONEKSJE]",10) || Mycmp(tablica[i],"[koneksje]",10)){
      ++i;
       while(!(tablica[i][0]==0))
      {
         WczytajKoneksje(s,tablica[i]);
         i++;
      }
      ++i;
   }
   if(Mycmp(tablica[i],"[BRZEGI]",8) || Mycmp(tablica[i],"[brzegi]",8)){
      int j;
      i++;
      while(!(tablica[i][0]=='['))
      {
         j=i+1;
     //cout << tablica[i] << endl;
         WczytajBrzegi(s,tablica[i],tablica[j]);
         i+=3;
      }
      ++i;
   }
   if(Mycmp(tablica[i],"[OBSZARY]",9) || Mycmp(tablica[i],"[obszary]",9)){
      
   }
  }
 }
}

void Wypisz_MSH(siatka & s)
{
   cout << "Liczba wymiarow wynosi: " << s.liczba_wymiarow << endl;
   cout << "Liczba wezlow wynosi: " << s.liczba_wezlow-1 << endl;
   cout << "Liczba elementow wynosi: " << s.liczba_elementow-1 << endl;
   cout << "Liczba brzegow wynosi: " << s.liczba_brzegow-1 << endl;
   cout << "Liczba obszarow wynosi: " << s.liczba_obszarow << endl;
   for(int i=1;i<s.liczba_wezlow;i++) cout << "nr: " << i << "  x: "<< s.pkty[i].x << "  y: " << s.pkty[i].y << endl;
   cout << endl <<"Elementy"<< endl;
   for(int i=1;i<s.liczba_elementow;i++) cout << "nr: " << i << "  W1: "<< s.koneksje[i].w1->nr << "  W2: " << s.koneksje[i].w2->nr << "  W3: " << s.koneksje[i].w3->nr << endl;
   cout << endl <<"Brzegi";
   for(int i=1;i<s.liczba_brzegow;i++){
      cout << endl << "nr: " << i << "  obszar: " << s.brzegi[i].obszar << "  elementy:";
      for(unsigned int j=1;j<s.brzegi[i].elementy.size();j++){
         cout << " " << s.brzegi[i].elementy[j];
      }
   }
   cout << endl;
}

